package com.mars.component.mq;

import java.io.Serializable;
import java.util.Map;

import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.core.MessagePostProcessor;
import org.springframework.stereotype.Component;

@Component
public class JmsTopicMessage {

	private Logger logger = LoggerFactory.getLogger(JmsTopicMessage.class) ;
	
	@Resource(name="jmsTopicTemplate")
	private JmsTemplate jmsTemplate ;
	
	@Value("${default.topic.destination}")
	private String defaultDestination ;
	
	/**
	 * 发送MQ异步消息，消息模式：Topic订阅模式
	 * 消息发送到默认的队列上
	 * @param message
	 */
	public void publish(final Serializable message) {
		logger.info("发送MQ异步消息，消息类型：[订阅模式]，发送到默认的队列：[{}]", defaultDestination);
		this.jmsTemplate.send(new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createObjectMessage(message);
			}
		});
	}
	
	/**
	 * 发送MQ异步消息，消息模式：Topic订阅模式
	 * @param destinationName 队列名称，发送消息到指定队列
	 * @param message 要发送的消息
	 */
	public void publish(String destinationName, final Serializable message) {
		logger.info("发送MQ异步消息，消息类型：[订阅模式]，发送到指定队列：[{}]", destinationName);
		this.jmsTemplate.send(destinationName, new MessageCreator() {
			@Override
			public Message createMessage(Session session) throws JMSException {
				return session.createObjectMessage(message);
			}
		});
	}
	
	/**
	 * 发送MQ异步消息，消息模式：Topic订阅模式
	 * @param destinationName 队列名称，发送消息到指定队列
	 * @param map Map集合对象
	 */
	public void publish(String destinationName, Map<String, Object> map) {
		logger.info("发送MQ异步消息，消息类型：[订阅模式]，发送到指定队列：[{}]，数据类型：[Map]", destinationName);
		this.jmsTemplate.convertAndSend(destinationName, map, new MessagePostProcessor() {
			@Override
			public Message postProcessMessage(Message message) throws JMSException {
				return message;
			}
		});
	}
	

	public JmsTemplate getJmsTemplate() {
		return jmsTemplate;
	}

	public void setJmsTemplate(JmsTemplate jmsTemplate) {
		this.jmsTemplate = jmsTemplate;
	}
}
